import { getNewCartGoods } from '@/api/cart'

// 购物车状态
export default {
  namespaced: true,
  state: () => {
    return {
      list: []
    }
  },
  mutations: {
    insertCart (state, payload) {
      // 考虑两种情况：
      //  情况1：已经添加过的商品(skuid已存在)，是数量的累加
      //  情况2：没有添加过的就添加到列表前
      const index = state.list.findIndex(item => item.skuId === payload.skuId)
      if (index >= 0) {
        // 如果有skuid了，那就是数量的追加
        state.list[index].count += payload.count
      } else {
        state.list.unshift(payload)
      }
    },
    // 删除购物车的商品
    deleteCart (state, payload) {
      state.list = state.list.filter(item => item.skuId !== payload)
    },
    // 更新修改购物车商品对象
    updateCart (state, goods) {
      const obj = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        obj[key] = goods[key]
      }
    }

  },
  actions: {
    //  store.rootState 可以访问到整个大的 state，跨模块访问数据
    insertCart (store, payload) {
      console.log(store.rootState)
      // 包装成 Promise 对象，在调用 dispatch 后可通过 then
      return new Promise((resolve) => {
        // 分两种情况:
        if (store.rootState.user.profile.token) {
        // 1. 已登录 - 发送请求
          console.log('1. 已登录 - 发送请求')
          store.commit('insertCart', payload)
          resolve()
        } else {
        // 2. 未登录 - 直接修改本地
          store.commit('insertCart', payload)
          console.log('2没登录')
          resolve()
        }
      })
    },
    // 删除的异步
    deleteCart (store, skuId) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {
          // 1. 已登录 - 发送请求
        } else {
          store.commit('deleteCart', skuId)
          resolve('删除成功')
        }
      })
    },
    // 批量删除
    batchDeleteCart (store, isInvalid) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {
          // 1. 已登录 - 发送请求
        } else {
          store.getters[isInvalid === true ? 'invalidList' : 'selectedList'].forEach(item => {
            store.commit('deleteCart', item.skuId)
          })
          resolve('删除成功')
        }
      })
    },
    // 有效商品的全选双向
    checkAllCart (store, selected) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {

        } else {
          store.getters.validList.forEach(item => {
            // 注意这里还不能修改到仓库的数据
            item.selected = selected
            // 调用 commit 才能修改仓库的数据
            store.commit('updateCart', item)
          })
          resolve()
        }
      })
    },
    // 更新修改购物车商品对象
    updateCart (store, goods) {
      console.log(goods)
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {

        } else {
          store.commit('updateCart', goods)
          resolve('更新成功')
        }
      })
    },
    // 获取购物车列表
    findCartList (store) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {
          // 登录后 TODO ...
          resolve('线上接口')
        } else {
          // 情况2：未登录 -  未登录也要同步最新商品信息(价格,库存...)
          store.state.list.forEach(async item => {
            const { result } = await getNewCartGoods(item.skuId)
            // skuId 用于查找，result 是要更新的信息
            store.commit('updateCart', { ...result, skuId: item.skuId })
          })
          resolve('本地操作')
        }
      })
    },
    // 修改sku规格函数
    updateCartSku (store, { oldSkuId, newSku }) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {
          resolve('更新成功-线上')
        } else {
          // 先删除后加入购物车
          const oldGoods = store.state.list.find(item => item.skuId === oldSkuId)
          console.log(oldGoods, newSku)

          // 删除
          store.commit('deleteCart', oldSkuId)
          // 3. 获取数据并改名更新(因为商品详情页和购物车列表页后端返回的字段名不同)
          const { price: nowPrice, inventory: stock, oldPrice: price, skuId, specsText: attrsText } = newSku
          // 4. 合并成完整的购物车商品对象
          store.commit('insertCart', { ...oldGoods, nowPrice, stock, price, skuId, attrsText })
          resolve('更新成功-本地')
        }
      })
    }

  },
  getters: {
    validList (state) {
      // 有效的和有库存的
      return state.list.filter(item => item.isEffective && item.stock > 0)
    },
    // 有效商品件数
    validTotal (state, getters) {
      console.log(state, getters)
      // 以前淘宝计算方式
      // return getters.validList.length
      // 京东计算方式  (计数的方式)
      return getters.validList.reduce((sum, item) => sum + item.count, 0)
    },
    // 有效的商品总金额
    validAmount (state, getters) {
      // JS 小数的计算会容易出现精度不准的问题，解决方案：把小数先放大处理成整数，计算完毕后，再除以倍数变回小数
      return (getters.validList.reduce((sum, item) => sum + item.count * item.nowPrice * 100, 0) / 100).toFixed(2)
    },
    // 无效商品列表
    invalidList (state) {
      return state.list.filter(item => !item.isEffective || item.stock === 0)
    },
    // 选中商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 选中商品的件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 选中商品的总金额
    selectedAmount (state, getters) {
      return (getters.selectedList.reduce((sum, item) => sum + item.count * item.price * 100, 0) / 100).toFixed(2)
    },
    // 是否全选
    isCheckAll (state, getters) {
      return getters.validList.length === getters.selectedList.length && getters.validList.length !== 0
    }

  }

}
